package Mundo;

import Interfeis.*;
import Datos.*;

public class ente {
    int Tempx=17500,Tempy=17500,Tempz=0;
    long x=0,y=0,z=0;
    double Orientacion =  Math.PI/2, A8pis = Math.PI/8 ,axy=0,ax=0,ay=0,az=0,Friccion=2,Gravedad=100;
    int Tipo_ente,aspecto=0,imagenes[],paso=0,aro,punto,Npasos=8;
    keyPad Control;
    raton Raton;
    graf   MGraf;    
    cargar Almacen;
    int Pantalla=0;
    
    int caracteristica[] = {50,50,50,100,50,50,50,50};
    // Agilidad,Constitucion,Destreza,Fuerza,Inteligencia,Percepcion,Poder,Voluntad.    
    
    public ente(int Tipo,keyPad Key,raton r)
    {
        
     Control   = Key;
     Tipo_ente = Tipo;
     Raton = r;
     
    }
    
    public void Cinetica() 
    {
           
     if (Control.LEFT()  ) Orientacion+=((double)caracteristica[0])/800;   
     if (Control.RIGHT() ) Orientacion-=((double)caracteristica[0])/800; 
     
     if ( Orientacion  < 0 ) Orientacion += 2*Math.PI;
     if ( Orientacion  > (2*Math.PI) ) Orientacion -= 2*Math.PI;
         
     if (Control.UP()  ) Mover((int)(Math.sin(Orientacion)*caracteristica[3])       , (int)(Math.cos(Orientacion)*caracteristica[3])       ,0);
     if (Control.DOWN()) Mover((int)(Math.sin(Orientacion)*caracteristica[3]/4) * (-1), (int)(Math.cos(Orientacion)*caracteristica[3]/4) * (-1),0);
     
     if (Raton.LEFT())
        Mover((int)(Math.sin(Orientacion)*caracteristica[3])       , (int)(Math.cos(Orientacion)*caracteristica[3])       ,0);
     
     axy=Math.sqrt((ax*ax)+(ay*ay));
     if (axy>(caracteristica[0]*3)) 
     {
      ax=ax/axy; ay=ay/axy;
      ax=ax*(caracteristica[0]*3);         
      ay=ay*(caracteristica[0]*3);                 
     }             
     
     axy=Math.sqrt((ax*ax)+(ay*ay));
     if (axy!=0) 
     {
      ax+= (ax/axy)*Friccion*-1;
      ay+= (ay/axy)*Friccion*-1;        
     }
     
     if (axy<1)
     {
     ax=0;
     ay=0;
     }
    
     x +=ax;
     y +=ay;
     z +=az;     
     
     if (x<0) x=0;
     if (y<0) y=0;
              
     paso= ((int)(x+y)/12)%300;     
             
     aspecto = ( Orientacion - A8pis < 0) ? 0 : (int)(((Orientacion)) / (A8pis*2));    
     
    }        
    
    public void Hacer() 
    {
     Cinetica() ;
     MGraf.Put_Map(punto,Pantalla,12+100+(Tempx/100)+(int)(Math.sin(Orientacion)*15),22+100+(Tempy/100)+(int)(Math.cos(Orientacion)*8));        
     //MGraf.Put_Map(aro,Pantalla,100+(Tempx/100),100+(Tempy/100));        
     MGraf.Put_Map(Imagen(),Pantalla,100+(Tempy/100),100+(Tempy/100));        
    }    
    
    public void Mover(int xx,int yy,int zz)
    {  
        
     ax+=xx;
     ay+=yy;
     az+=zz;
     /*
     x+=xx;
     y+=yy;
     z+=zz;        
     */ 
    }
     public void Set_xyz(int xx,int yy,int zz)
    {    
     x=xx;
     y=yy;
     z=zz;
    }   
      public void Set_Fisic(int Gra,int Fri)
    {    
     Friccion=Fri;
     Gravedad=Gra;
    }  
      public void Set_Imagenes(int sprites[])
    {    
     imagenes = sprites;
    }  
     
    public int Aspecto()
    {
     return(aspecto);
    }    
    public int x()
    {    
     return((int)x/100);
    }
    public int y()
    {    
     return((int)y/100);
    }    
    public int z()
    {    
     return((int)z/100);
    }
    public int Imagen()
    {    
     return(imagenes[aspecto+((paso/100)*Npasos)]);
    }
    public void Set_graf(graf Graf)
    {
     MGraf=Graf;        
    }
    public void Set_Almacen(cargar almacen)
    {
     Almacen=almacen;   
     Set_Imagenes(Almacen.Map_array(2,MGraf));
     
     aro=MGraf.Ini_Ima("sprites/aro.bmp");
     punto=MGraf.Ini_Ima("sprites/punto.bmp");
    }
}
